package com.ruoyi.workflow.service.impl;

import java.util.List;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.workflow.domain.BpmnNode;
import com.ruoyi.workflow.mapper.BpmnNodeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.workflow.service.IBpmnNodeService;

/**
 * 流程定义节点Service业务层处理
 * 
 * @author xiaodu
 * @date 2023-06-24
 */
@Service
public class BpmnNodeServiceImpl implements IBpmnNodeService
{
    @Autowired
    private BpmnNodeMapper bpmnNodeMapper;

    /**
     * 查询流程定义节点
     * 
     * @param id 流程定义节点主键
     * @return 流程定义节点
     */
    @Override
    public BpmnNode selectBpmnNodeById(Long id)
    {
        return bpmnNodeMapper.selectBpmnNodeById(id);
    }

    /**
     * 查询流程定义节点列表
     * 
     * @param bpmnNode 流程定义节点
     * @return 流程定义节点
     */
    @Override
    public List<BpmnNode> selectBpmnNodeList(BpmnNode bpmnNode)
    {
        return bpmnNodeMapper.selectBpmnNodeList(bpmnNode);
    }

    /**
     * 新增流程定义节点
     * 
     * @param bpmnNode 流程定义节点
     * @return 结果
     */
    @Override
    public int insertBpmnNode(BpmnNode bpmnNode)
    {
        //保存任务结点信息
        int nodeResult = bpmnNodeMapper.insertBpmnNode(bpmnNode);
        if(nodeResult == 0){
            throw new ServiceException("结点信息保存失败!");
        }
        //维护节点和审核人员的关系
        int auditorResult = bpmnNodeMapper.insertAuditorByBatch(bpmnNode.getId(), bpmnNode.getAuditors());
        if(auditorResult == 0){
            throw new ServiceException("审核人员信息保存失败!");
        }
        return nodeResult;
    }

    /**
     * 修改流程定义节点
     * 
     * @param bpmnNode 流程定义节点
     * @return 结果
     */
    @Override
    public int updateBpmnNode(BpmnNode bpmnNode)
    {
        //1.修改流程定义节点信息
        int nodeUpdateResult = bpmnNodeMapper.updateBpmnNode(bpmnNode);
        if(nodeUpdateResult == 0){
            throw new ServiceException("修改流程定义节点信息失败!");
        }
        //2.修改审批人：先删除后添加
        //2.1 根据节点id删除节点和审核人的关系
        int auditorDelResult = bpmnNodeMapper.deleteAuditorById(bpmnNode.getId());
        //2.2 重新保存维护节点和审核人的关系
        int auditorSaveResult = bpmnNodeMapper.insertAuditorByBatch(bpmnNode.getId(), bpmnNode.getAuditors());
        if(auditorDelResult == 0 || auditorSaveResult == 0){
            throw new ServiceException("节点和审核人的关系修改失败!");
        }
        return nodeUpdateResult;
    }

    /**
     * 批量删除流程定义节点
     * 
     * @param ids 需要删除的流程定义节点主键
     * @return 结果
     */
    @Override
    public int deleteBpmnNodeByIds(Long[] ids)
    {
        //删除节点相关信息
        int nodeResult = bpmnNodeMapper.deleteBpmnNodeByIds(ids);
        //删除节点和审批人之间的关系
        bpmnNodeMapper.deleteAuditorByIds(ids);
        return nodeResult;
    }

    /**
     * 删除流程定义节点信息
     * 
     * @param id 流程定义节点主键
     * @return 结果
     */
    @Override
    public int deleteBpmnNodeById(Long id)
    {
        return bpmnNodeMapper.deleteBpmnNodeById(id);
    }
}
